'''
Description: 
Author: Zilu
Date: 2021-11-04 15:13:37
Version: 
LastEditTime: 2021-11-06 00:02:34
LastEditors: Zilu
'''

# 函数式编程的一个特点就是，允许把函数本身作为参数传入另一个函数，还允许返回一个函数！
# 函数可以传递给变量，函数名也是一个变量，指向函数对象的变量
f = abs
f
f(-10)
abs(-10)

# 函数名不能指向其他对象
# abs = 10          # 使用错误

# 高阶函数
def add_func(x, y, f):
    return f(x) + f(y)

add_func(-5, 6, f)

# map 函数，第一个参数是函数，第二个是 Iterable，并把函数作用在 Iterable 每个元素上，返回 Iterator
def func(x):
    return x**2

r = map(func, range(1,10))
list(r)

# map 是高阶函数，可以计算任意复杂的函数
list(map(str, [1,2,3,4,5,6,7,8,9]))

# reduce 把函数作用在一个 Iterable 上，并和 Iterable 中的下一个元素累计计算
from functools import reduce
def add(x,y):
    return x + y

reduce(add,[1,2,3,4,5])
sum([1,2,3,4,5])

# 练习：利用map()函数，把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。
def normalize(name):
    normalize_name = name[0].upper() + name[1:].lower()
    return normalize_name

L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))

# 练习：请编写一个prod()函数，可以接受一个list并利用reduce()求积。
def prod(L):
    def product(x,y):
        return x * y
    return reduce(product,L)

# 练习：利用map和reduce编写一个str2float函数，把字符串'123.456'转换成浮点数123.456
def str2float(s):
    flag = True
    if (s[0] == '-'):
        flag = False
        ss = s[1:]
    else:
        ss = s
    point = ss.find('.')
    s_float = reduce(lambda x,y: x*10+y,map(int,ss[:point])) + reduce(lambda x,y:x/10 +y,map(int,ss[point+1:][::-1])) / 10 
    if flag:
        return s_float
    else: 
        return -s_float

a = str2float('123.456')
b = str2float('-123.456')

float
